ssize_t rio_readn(int fd,void *usrbuf,size_t n)
{
size_t nleft=n;
ssize_t nread;
char *bufp = usrbuf;

while(nleft>0){
if((nread=read(fd,bufp,nleft))<0){
if(errno==EINTR)
nread=0;
else
return -1;
}
else if (nread==0)
break;
nleft-=nread;
bufp+=nread;
}
return (n-nleft);
}